package eduware.util;



import com.wolfram.alpha.WAEngine;
import com.wolfram.alpha.WAException;
import com.wolfram.alpha.WAPlainText;
import com.wolfram.alpha.WAPod;
import com.wolfram.alpha.WAQuery;
import com.wolfram.alpha.WAQueryResult;
import com.wolfram.alpha.WASubpod;

import eduware.dozent.MessageQueue;

/***************************************
 * class for integration of wolfram alpha
 * to use this class it is necessary to create an object of it first (<b>not STATIC</b>)
 * @author Maik
 * 
 */

public class WolframAlpha {

	/***
	 * Application ID of WolframAlpha
	 */
	protected final String appid = "9YP6T9-A64T6YALAX";
	
	/***
	 * function for query on wolframAlpha
	 * @author Maik
	 * @param term search term
	 * @return answer as String
	 */
	
	
	public String query(String term) {
		
		String answer = "";
		
		// generate the WA Engine and set the appID
		WAEngine engine = new WAEngine();
		engine.setAppID(appid);
	    engine.addFormat("plaintext");
	    
	    // create a query
	    WAQuery query = engine.createQuery();
	    query.setInput(term);
	    	    
	    try {
	    	
	    	// execute the query
	    	WAQueryResult queryResult = engine.performQuery(query);
	    	
	    	// check for errors
	    	if (queryResult.isError()) {
                System.out.println("Query error");
                System.out.println("  error code: " + queryResult.getErrorCode());
                System.out.println("  error message: " + queryResult.getErrorMessage());
                MessageQueue.getInstance().addPrimaryMessage("Oops! Da ist intern etwas schiefgegangen. Bitte versuche es noch einmal.");
                
                
            } else if (!queryResult.isSuccess()) {
            	// query was not successful
            	MessageQueue.getInstance().addPrimaryMessage("Sorry! Leider habe ich deine Frage nicht verstanden!");
                
            } else {
                // WA sent an result
                
                // iterate through all pods that had been returned
            	for (WAPod pod : queryResult.getPods()) {
                	String tit = pod.getTitle().toLowerCase();
                	
                	// scan for results, definitions or solutions
                    if (!pod.isError() && ( tit.contains("result") || tit.contains("definition") || tit.contains("solution"))) {

                    	// read all subpods and extract the answer string
                    	for (WASubpod subpod : pod.getSubpods()) {
                            for (Object element : subpod.getContents()) {
                                if (element instanceof WAPlainText) {
                                    answer = ((WAPlainText) element).getText();
                                }
                            }
                        }
                    }
                }
            }
	    	
	    }
	    catch (WAException e) {
	    	String err = e.getCause().toString();
	    		    	
	    	if(err.contains("UnknownHostException")) {
	    		MessageQueue.getInstance().addPrimaryMessage("Du bist leider nicht mit dem Internet verbunden. Deine Frage kann nicht beantwortet werden.");
	    	}
	    	
	    	else if(err.contains("timed out")) {
	    		MessageQueue.getInstance().addPrimaryMessage("Du bist scheinbar nicht mit dem Internet verbunden. Deine Frage kann nicht beantwortet werden.");
	    	}
	    	
	    	else {
	    		MessageQueue.getInstance().addPrimaryMessage("Oops! Da ist intern etwas schiefgegangen. Bitte versuche es noch einmal.");
	    		e.printStackTrace();
	    	}
        }
	    
		
		return answer;
	}
}
